package com.github.chirspan.xaas.exception;

import cn.hutool.core.exceptions.ExceptionUtil;
import com.github.chirspan.xaas.core.exception.BizException;
import com.github.chirspan.xaas.core.rest.RestResult;
import com.github.chirspan.xaas.core.rest.RestResultStatus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.data.redis.RedisConnectionFailureException;
import org.springframework.data.redis.RedisSystemException;

import java.sql.SQLException;

/**
 * *******description*******
 * 全局异常处理
 * *************************
 *
 * @author chenpan
 * @date 2020/5/14 17:07
 */
@Slf4j
public class GlobalExceptionHandler {

    /**
     * NullPointerException
     * 当应用程序试图访问空对象时，则抛出该异常
     * <p>
     * <p>
     * SQLException
     * 提供关于数据库访问错误或其他错误信息的异常
     * <p>
     * <p>
     * IndexOutOfBoundsException
     * 指示某排序索引（例如对数组、字符串或向量的排序）超出范围时抛出
     * <p>
     * <p>
     * NumberFormatException
     * 当应用程序试图将字符串转换成一种数值类型，但该字符串不能转换为适当格式时，抛出该异常
     * <p>
     * <p>
     * FileNotFoundException
     * 当试图打开指定路径名表示的文件失败时，抛出此异常
     * <p>
     * <p>
     * IOException
     * 当发生某种I/O异常时，抛出此异常。此类是失败或中断的I/O操作生成的异常的通用类
     * <p>
     * <p>
     * ClassCastException
     * 当试图将对象强制转换为不是实例的子类时，抛出该异常
     * <p>
     * <p>
     * ArrayStoreException
     * 试图将错误类型的对象存储到一个对象数组时抛出的异常
     * <p>
     * <p>
     * IllegalArgumentException
     * 抛出的异常表明向方法传递了一个不合法或不正确的参数
     * <p>
     * <p>
     * ArithmeticException
     * 当出现异常的运算条件时，抛出此异常。例如，一个整数“除以零”时，抛出此类的一个实例
     * <p>
     * <p>
     * NegativeArraySizeException
     * 如果应用程序试图创建大小为负的数组，则抛出该异常
     * <p>
     * <p>
     * NoSuchMethodException
     * 无法找到某一特定方法时，抛出该异常
     * <p>
     * <p>
     * SecurityException
     * 由安全管理器抛出的异常，指示存在安全侵犯
     * <p>
     * <p>
     * UnsupportedOperationException
     * 当不支持请求的操作时，抛出该异常
     * <p>
     * <p>
     * RuntimeException
     * 是那些可能在Java虚拟机正常运行期间抛出的异常的超类
     *
     * @param e
     * @return
     */
    public static RestResult defaultErrorHandler(Exception e) {

        log.error("异常：", e);
        return new RestResult(RestResultStatus.SYSTEM_ERR, e.getMessage(), null);
    }

    public static RestResult handleRestError(Exception e) {
        log.error("请求错误：", e);
        /*if (ase != null) {
            return new RestResult(RestResultStatus.DB_ERROR, "数据库无法连接", null);
        }*/
        if (e instanceof SecurityException) {
            return new RestResult(RestResultStatus.UNAUTH_ERROR);
        } else if (e instanceof RedisConnectionFailureException) {
            //redis连接异常
            return new RestResult(RestResultStatus.REDIS_CONNECT_ERROR);
        } else if (e instanceof RedisSystemException) {
            //redis异常
            return new RestResult(RestResultStatus.REDIS_ERROR);
        } else if (e instanceof InvalidDataAccessApiUsageException) {
            //redis异常
            return new RestResult(RestResultStatus.REDIS_ERROR);
        } else if (e instanceof SQLException) {
            return new RestResult(RestResultStatus.DB_ERROR);
        } else if (e instanceof BizException) {
            return new RestResult(RestResultStatus.BUSINESS_ERROR, e.getMessage(), null);
        }
        return new RestResult(RestResultStatus.SYSTEM_ERR, ExceptionUtil.getMessage(e), null);
    }

}
